﻿#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

// 菜单
void menu()
{
	printf("----------------------------------------\n");
	printf("|**********      1. play      *********|\n");
	printf("|**********      0. exit      *********|\n");
	printf("----------------------------------------\n");
}

// 初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}

// 打印棋盘
// _____________
// |   |   |   | 1
// |---|---|---| 
// |   |   |   | 2
// |---|---|---| 
// |   |   |   | 3
// ˉˉˉˉˉˉˉ
//   1   2   3
//
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	// _____________
	for (int i = 0; i < row * 3 + row + 1; i++)
		printf("_");
	printf("\n");

	// |   |   |   | 1
	// |---|---|---| 
	// |   |   |   | 2
	// |---|---|---| 
	// |   |   |   | 3
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf("| %c ", board[i][j]);

			if (j + 1 == row)
				printf("| %d\n", i + 1);
		}

		if (i < row - 1)
		{
			for (int k = 0; k < col; k++)
			{
				printf("|---");

				if (k + 1 == row)
					printf("|\n");
			}
		}
	}

	// ˉˉˉˉˉˉˉ
	for (int i = 0; i < row * 3 + row + 1; i++)
		printf("ˉ");
	printf("\n");

	//   1   2   3
	for (int i = 1; i <= row; i++)
		printf("  %d ", i);
	printf("\n\n"); 
}

// 玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋，请输入横纵坐标（用空格隔开）：");

	while (1)
	{
		int x = 0;
		int y = 0;
		scanf("%d %d", &x, &y);

		if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
		{
			if (board[x-1][y-1] == ' ')
			{
				board[x - 1][y - 1] = 'O';
				return;
			}
			else
			{
				printf("此点位已落子，请重新输入横纵坐标：");

			}
		}
		else
		{
			printf("非法输入，请重新输入横纵坐标：");
		}
	}
}

// 电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑下棋：\n");

	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;

		if (board[x][y] == ' ')
		{
			board[x][y] = 'X';
			return;
		}
	}
}

// 判断棋盘是否下满
// 1表示满了
// 0表示没有满
static int IsFill(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}

	return 1;
}

// 判断输赢
// 玩家赢 - 'O'
// 电脑赢 - 'X'
// 平局 - 'Q'
// 继续 - 'C'
char IsWin(char board[ROW][COL], int row, int col)
{
	int flag = 0;

	// 判断每一行
	for (int i = 0; i < row; i++)
	{
		int j = 0;
		
		for (j = 0; j < col - 1; j++)
		{
			if ((board[i][j] == board[i][j + 1]) && (board[i][j] != ' '))
			{
				flag = 1;
			}
			else
			{
				flag = 0;
				break;
			}
		}

		if (flag)
			return board[i][j];
	}

	// 判断每一列
	for (int j = 0; j < col; j++)
	{
		int i = 0;

		for (i = 0; i < row - 1; i++)
		{
			if ((board[i][j] == board[i + 1][j]) && (board[i][j] != ' '))
			{
				flag = 1;
			}
			else
			{
				flag = 0;
				break;
			}
		}

		if (flag)
			return board[i][j];
	}

	// 判断左上到右下
	int x = 0;
	int y = 0;

	while (x < row - 1 && y < col - 1)
	{
		if ((board[x][y] == board[x + 1][y + 1]) && (board[x][y] != ' '))
		{
			flag = 1;
			x++;
			y++;
		}
		else
		{
			flag = 0;
			break;
		}
	}

	if (flag)
		return board[x][y];

	// 判断右上到左下
	x = 0;
	y = col - 1;

	while (x < row - 1 && y > 0)
	{
		if ((board[x][y] == board[x + 1][y - 1]) && (board[x][y] != ' '))
		{
			flag = 1;
			x++;
			y--;
		}
		else
		{
			flag = 0;
			break;
		}
	}

	if (flag)
		return board[x][y];

	// 判断左下到右上
	x = row - 1;
	y = 0;

	while (x > 0 && y < col - 1)
	{
		if ((board[x][y] == board[x - 1][y + 1]) && (board[x][y] != ' '))
		{
			flag = 1;
			x--;
			y++;
		}
		else
		{
			flag = 0;
			break;
		}
	}

	if (flag)
		return board[x][y];

	// 判断右下到左上
	x = row - 1;
	y = col - 1;

	while (x > 0 && y > 0)
	{
		if ((board[x][y] == board[x - 1][y - 1]) && (board[x][y] != ' '))
		{
			flag = 1;
			x--;
			y--;
		}
		else
		{
			flag = 0;
			break;
		}
	}

	if (flag)
		return board[x][y];

	// 判断棋盘是否下满
	if (IsFill(board, ROW, COL))
		return 'Q';

	// 继续
	return 'C';
}